package com.z.action;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.http.client.ClientProtocolException;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import com.z.dao.ZpInfoDao;
import com.z.dao.impl.ZpInfoDaoImpl;
import com.z.dto.ZpInfoDto;
import com.z.utils.Configs;
import com.z.utils.Utils;
/**
 * 爬取数据
 * @author 1340105413@qq.com
 *
 */
public class CrawlerSearch {
	private static boolean flag=true;
	private static BufferedWriter bw=null;
	private static int serialNo=0;
	//要爬取的url
	private static String url="http://sou.zhaopin.com/jobs/searchresult.ashx" +
			"?bj=160000" +
			"&sj=045;053;679;863;2040&in=210500;160400;160000;300100;160100;160600;180000;180100" +
			"&jl=北京" +
			"&sg=54fe54b900c74bfc856102a2cc923782" +
			"&isadv=0"+
			"&p=";
	/**
	 * 主运行程序
	 * @param args
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	public static void main(String[] args) {
		doMain(Configs.pages);
	}
	/**
	 * 
	 * @param pages 要爬取的总页数
	 */
	private static void doMain(int pages) {
		String tmpUrl=url;
		int firstPage=0;
		if(Configs.firstPage>0){
			firstPage=(Configs.firstPage-1);
		}
		for (int i = 0; i <pages; i++) {
			bw=null;
			serialNo+=1;
			if(flag){
				url=tmpUrl;
				url+=(firstPage+i+1);
			}
			Elements elements;
			System.out.println(url);
			try {
				elements = pagesQuery(url+"");
				/**
				 * 解析html
				 */
				paresXml(elements);
			} catch (ClientProtocolException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {
			closeBw();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	private static Elements pagesQuery(String tmpUrl) throws IOException,
			ClientProtocolException {
		// 使用Jsoup解析网页内容
		Document document =Utils.getDocument(tmpUrl);
		// 使用元素选择器选择网页的内容
		Elements elements = document.select(".newlist");
		if(elements.size()<1){
			flag=false;
		}
		return elements;
	}
	/**
	 * 爬取xml数据的解析
	 * @param elements 请求返回的所有html
	 */
	private static void paresXml(Elements elements) {
		if(elements==null) return;
		List<ZpInfoDto> list=new ArrayList<ZpInfoDto>();
		ZpInfoDto dto=null;
		ZpInfoDao dao=new ZpInfoDaoImpl();
		for (int i = 0; i < elements.size(); i++) {
			if(i==0){
				/**
				 * 打印道控制台
				 */
				if(Configs.isOutputConsole){
					System.out.println("序号\t"+elements.eq(i).select(".zwmc").text()
							+"\t childPath"
							+"\t"+elements.eq(i).select(".gsmc").text()
							+"\t"+elements.eq(i).select(".zwyx").text()
							+"\t反馈率"
							+"\t"+elements.eq(i).select(".gzdd").text()
							+"\t详细描述");
				}
				try {
					/**
					 * 是否写入文件
					 */
					if(Configs.isWriteFile){
						writer("序号\t"+elements.eq(i).select(".zwmc").text()
								+"\t childPath"
								+"\t"+elements.eq(i).select(".gsmc").text()
								+"\t"+elements.eq(i).select(".zwyx").text()
								+"\t反馈率"
								+"\t"+elements.eq(i).select(".gzdd").text()
								+"\t详细描述");
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
				continue;
			}
			/**
			 * 打印道控制台
			 */
			if(Configs.isOutputConsole){
				System.out.println((i)+"\t"+elements.eq(i).select(".zwmc a").first().text()
						+"\t"+elements.eq(i).select(".zwmc a").first().attr("href")
						+"\t"+elements.eq(i).select(".gsmc a").first().text()
						+"\t"+elements.eq(i).select(".zwyx").text()
						+"\t"+elements.eq(i).select(".fk_lv").text()
						+"\t"+elements.eq(i).select(".gzdd").text()
						+"\t"+elements.eq(i).select(".newlist_deatil_two").text());
			}
			try {
				/**
				 * 是否写入文件
				 */
				if(Configs.isWriteFile){
					writer((i)+"\t"+elements.eq(i).select(".zwmc a").first().text()
						+"\t"+elements.eq(i).select(".zwmc a").first().attr("href")
						+"\t"+elements.eq(i).select(".gsmc a").first().text()
						+"\t"+elements.eq(i).select(".zwyx").text()
						+"\t"+elements.eq(i).select(".fk_lv").text()
						+"\t"+elements.eq(i).select(".gzdd").text()
						+"\t"+elements.eq(i).select(".newlist_deatil_two").text());
				}
				/**
				 * 是否插入数据库
				 */
				if(Configs.isInDatabase){
					dto=new ZpInfoDto(elements.eq(i).select(".zwmc a").first().text(), elements.eq(i).select(".zwmc a").first().attr("href"),
							elements.eq(i).select(".gsmc a").first().text(), elements.eq(i).select(".zwyx").text(),
							elements.eq(i).select(".fk_lv").text(), elements.eq(i).select(".gzdd").text(), 
							elements.eq(i).select(".newlist_deatil_two").text());
					list.add(dto);
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		/**
		 * 是否插入数据库
		 */
		if(Configs.isInDatabase){
			dao.insert(list);
		}
	}
	/**
	 * 写入到文件
	 * @param content
	 * @throws IOException
	 */
	private static void writer(String content) throws IOException{
		if(bw==null){
			SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
			bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(Configs.path+sdf.format(new Date())+serialNo+".txt"))));
		}
		bw.write(content);
		bw.newLine();
		bw.flush();
	}
	/**
	 * 关闭写入工作流
	 * @throws IOException
	 */
	private static void closeBw() throws IOException{
		if(bw!=null){
			bw.close();
		}
	}
}
